/*
 *  this program is a test program for getopt_long function
 *
 *  write by Forrest.zhang
 */

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int
main(int argc, char** argv)
{
    int        c;
    int        digit_optind = 0;

    while (1) {
	int this_option_optind = optind ? optind : 1;
	int option_index = 0;
	static struct option long_options[] = {
	    {"add",     1, 0, 0},
	    {"append",  0, 0, 0},
	    {"delete",  1, 0, 0},
	    {"verbose", 0, 0, 0},
	    {"create",  1, 0, 'c'},
	    {"file",    1, 0, 0},
	    {0,         0, 0, 0}
	};

	c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index);

	if (c == -1)
	    break;

	switch (c) {
	case 0:
	    printf("option %s", long_options[option_index].name);
	    if (optarg)
		printf(" with arg %s", optarg);
	    printf("\n");
	    break;
	case '0':
	case '1':
	case '2':
	    if (digit_optind != 0 && digit_optind != this_option_optind)
		printf("digits occur in two different argv-elements.\n");
	    digit_optind = this_option_optind;
	    printf("option %c\n", c);
	    break;
	case 'a':
	    printf("option a\n");
	    break;
	case 'b':
	    printf("option b\n");
	    break;
	case 'c':
	    printf("option c with value '%s'\n", optarg);
	    break;
	case 'd':
	    printf("option d with value '%s'\n", optarg);
	    break;
	case '?':
	    break;
	default:
	    printf("?? getopt returned character code 0%0 ??\n", c);
	}
    }

    if (optind < argc) {
	printf("non-option ARGV-elements: ");
	while (optind < argc)
	    printf("%s ", argv[optind++]);
	printf("\n");
    }

    return 0;
}






